home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / edit / pt20pc.zip / CTAGS.C < prev    next >
C/C++ Source or Header  |  1991-02-04  |  3KB  |  161 lines

  1. #include "stdio.h"
  2. #include "ctype.h"
  3. #include "dos.h"
  4.  
  5. enum stateType { inSingleQuotes, inDoubleQuotes, inComment, inOther };
  6. enum tokenType { singleQuote, doubleQuote, beginComment, endComment,
  7.     beginBracket, endBracket, idString, otherToken, openParen,
  8.     endOfFile };
  9. enum charType { other, alphaNumeric, sQuote, dQuote, oParen, bBracket,
  10.     eBracket, slash, star, eof };
  11.  
  12. enum tokenType GetToken( FILE * );
  13. char tokenString[100];    /* last string token read */
  14.  
  15. enum charType charTable[257];
  16. enum tokenType lastToken = otherToken;
  17.  
  18. main(argc, argv)
  19.     char *argv[];
  20. {
  21.     FILE *fp, *fout;
  22.     enum tokenType token;
  23.     enum stateType state = inOther;
  24.     int bracketCount = 0;
  25.     char currentFile[100];
  26.     struct find_t buffer;
  27.     unsigned retCode;
  28.     int i;
  29.  
  30.     fout = fopen("ptctags.lst", "w");
  31.     printf("Writing ctag file \"ptctags.lst\".\n");
  32.  
  33.     /* set up character coding table */
  34.     for( i = 0; i < 257; ++i )
  35.         charTable[i] = other;
  36.     for( i = 'a'; i <= 'z'; ++i )
  37.         charTable[i+1] = alphaNumeric;
  38.     for( i = 'A'; i <= 'Z'; ++i )
  39.         charTable[i+1] = alphaNumeric;
  40.     for( i = '0'; i <= '9'; ++i )
  41.         charTable[i+1] = alphaNumeric;
  42.     charTable[0]= eof;
  43.     charTable['\''+1]= sQuote;
  44.     charTable['"'+1] = dQuote;
  45.     charTable['('+1] = oParen;
  46.     charTable['{'+1] = bBracket;
  47.     charTable['}'+1] = eBracket;
  48.     charTable['/'+1] = slash;
  49.     charTable['*'+1] = star;
  50.  
  51. retCode = _dos_findfirst( "*.c", _A_NORMAL, &buffer );
  52. while( retCode == 0 ) {
  53.     fp = fopen( buffer.name, "r" );
  54.     printf("%s:\n", buffer.name);
  55.     while( 1 ) {
  56.         token = GetToken( fp );
  57.         switch( token ) {
  58.         case singleQuote:
  59.             if( state == inOther )
  60.                 state = inSingleQuotes;
  61.             else if( state == inSingleQuotes )
  62.                 state = inOther;
  63.             break;
  64.         case doubleQuote:
  65.             if( state == inOther )
  66.                 state = inDoubleQuotes;
  67.             else if( state == inDoubleQuotes )
  68.                 state = inOther;
  69.             break;
  70.         case beginComment:
  71.             if( state == inOther )
  72.                 state = inComment;
  73.             break;
  74.         case endComment:
  75.             if( state == inComment )
  76.                 state = inOther;
  77.             break;
  78.         case beginBracket:
  79.             if( state == inOther )
  80.                 ++bracketCount;
  81.             break;
  82.         case endBracket:
  83.             if( state == inOther )
  84.                 --bracketCount;
  85.             break;
  86.         case openParen:
  87.             if( lastToken == idString && bracketCount == 0 ) {
  88.                 fprintf(fout, "%s:%s\n", tokenString,
  89.                     buffer.name);
  90.                 printf("\t%s\n", tokenString);
  91.             }
  92.             break;
  93.         case idString:
  94.             break;
  95.         case otherToken:
  96.             break;
  97.         case endOfFile:
  98.             break;
  99.         }
  100.         if( token == endOfFile )
  101.             break;
  102.         lastToken = token;
  103.     }
  104.     fclose( fp );
  105.     retCode = _dos_findnext( &buffer );
  106. }
  107. fclose(fout);
  108. printf("Done\n");
  109. exit(0);
  110. }
  111.  
  112. enum tokenType
  113. GetToken( FILE *fp )
  114. {
  115.     int ch, len;
  116.  
  117. getAnother:
  118.     ch = getc( fp );
  119.     switch( charTable[ch+1] ) {
  120.  
  121.     case eof:
  122.         return endOfFile;
  123.     case sQuote:
  124.         return singleQuote;
  125.     case dQuote:
  126.         return doubleQuote;
  127.     case oParen:
  128.         return openParen;
  129.     case bBracket:
  130.         return beginBracket;
  131.     case eBracket:
  132.         return endBracket;
  133.     case slash:
  134.         ch = getc( fp );
  135.         if( ch == '*' )
  136.             return beginComment;
  137.         else
  138.             ungetc( ch, fp );
  139.     case star:
  140.         ch = getc( fp );
  141.         if( ch == '/' )
  142.             return endComment;
  143.         else
  144.             ungetc( ch, fp );
  145.         break;
  146.     case alphaNumeric:
  147.         len = 0;
  148.         do {
  149.             tokenString[len++] = ch;
  150.             ch = getc( fp );
  151.         } while( isalnum(ch) );
  152.         ungetc( ch, fp );
  153.         tokenString[len] = '\0';
  154.         return idString;
  155.     case other:
  156.         lastToken = otherToken;
  157.         goto getAnother;
  158.     }
  159. }
  160.  
  161.